package service;

import java.io.Serializable;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import dao.GenericDAO;
import dao.PessoaDAO;
import entity.Pessoa;
import entity.PessoaFisica;
import entity.PessoaJuridica;
import entity.Usuario;

@Service
public class PessoaServiceImpl extends ManutencaoServiceImpl<Pessoa> implements
		PessoaService, Serializable {

	private static final long serialVersionUID = -8754416176752850943L;

	@Autowired
	private PessoaDAO pessoaDAO;

	@Autowired
	private UsuarioService usuarioService;

	@Override
	public PessoaFisica criarNovaPessoaFisica() {
		final PessoaFisica pessoa = new PessoaFisica();
		pessoa.setAtivo(Boolean.TRUE);
		return pessoa;
	}

	@Override
	public PessoaJuridica criarNovaPessoaJuridica() {
		final PessoaJuridica pessoa = new PessoaJuridica();
		pessoa.setAtivo(Boolean.TRUE);
		return pessoa;
	}

	@Override
	public GenericDAO<Pessoa> getDAO() {
		return pessoaDAO;
	}

	@Override
	@Transactional
	public void remover(Pessoa pessoa) {
		final Usuario usuario = usuarioService.buscarPorPessoa(pessoa);
		if (usuario != null) {
			usuarioService.remover(usuario);
		}

		super.remover(pessoa);
	}

	@Override
	@Transactional
	public void salvarComUsuario(final Pessoa pessoa, final Usuario usuario) {

		if (pessoa.getId() != null && usuario == null) {

			final Usuario usuarioVinculado = usuarioService
					.buscarPorPessoa(pessoa);
			if (usuarioVinculado != null) {
				usuarioService.remover(usuarioVinculado);
			}

			super.salvar(pessoa);
			
		} else if (usuario != null) {
			super.salvar(pessoa);
			usuarioService.salvar(usuario);
		}
	}
	
	@Override
	public List<Pessoa> listarPessoaPorNome(String nome) {
		Pessoa pessoa = new Pessoa();
		pessoa.setAtivo(true);
		pessoa.setNome("%"+nome+"%");
		return pessoaDAO.listarPorExemplo(pessoa);
	}
}
